lst-array-attributes、lst-array-stats 与 lst-returns-calculation,完成shape/dtype、axis统计和收益。从数学角度,NumPy数组实现了张量的概念:
| 维度 | 数学名称 | 示例 |
|---|---|---|
| 0维 | 标量(Scalar) | \(5\) |
| 1维 | 向量(Vector) | \([1, 2, 3]\) |
| 2维 | 矩阵(Matrix) | \([[1,2],[3,4]]\) |
| 3维+ | 高维张量 | 时间序列数据立方体 |
对于 \(d\) 维张量 \(\mathbf{A}\),元素索引为 \(\mathbf{A}_{i_1, i_2, \ldots, i_d}\)
| 特性 | NumPy数组 | Python列表 |
|---|---|---|
| 内存布局 | 连续内存块 | 分散的对象引用 |
| 数据类型 | 同构(类型相同) | 异构(可混合) |
| 内存效率 | 紧凑(int32占4字节) | 每个对象约28字节 |
| 计算性能 | 向量化(C层面) | 解释执行(Python层面) |
NumPy快的秘密:向量化运算 + C语言底层实现
price_amazon、price_app1e、price_apple、data1 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。one_array2 的结果;同时写出方向、数量级或表格/图形结构。# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import numpy as np #导入NumPy模块并且用英文缩写np
price_amazon= np.array([170.23,170.10,177.59,177.06,178.22]) #直接创建一维数组
type (price_amazon) # 查看price_amazon的数据类型
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
price_apple=np.array(price_app1e) #将列表转换为一维数组
type(price_apple) # 查看price_apple的数据类型
#任务二
import numpy as np
data1 = [170.23,170.10,177.59,177.06,178.22] # 定义列表data1
data2 = [221.27,221.72,224.72,226.05,225.89] # 定义列表data2
data3 = [413.26,416.11,421.03,418.47,421.53] # 定义列表data3
data4 = [164.16,160.37,161.30,162.96,166.67] # 定义列表data4
data5 = [648.02,661.68,663.22,674.07,688.53] # 定义列表data5
price_array=np.array([data1,data2,data3,data4,data5]) #将以上列表数据创建成数组
print(price_array.shape) #查看数组的形状
print(price_array.ndim) #查看数组的维度
print(price_array.size) #查看数组的元素个数
print(price_array.dtype) #查看数组中的元素类型
#任务三
import numpy as np
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
n=price_array.size #变量n赋值为数组的元素个数
data1 = [170.23,170.10,177.59,177.06,178.22] # 定义列表data1
data2 = [221.27,221.72,224.72,226.05,225.89] # 定义列表data2
data3 = [413.26,416.11,421.03,418.47,421.53] # 定义列表data3
data4 = [164.16,160.37,161.30,162.96,166.67] # 定义列表data4
data5 = [648.02,661.68,663.22,674.07,688.53] # 定义列表data5
price_array=np.array([data1,data2,data3,data4,data5]) #将以上列表数据创建成数组
n=price_array.size #变量n赋值为数组的元素个数
x=np.arange(n+1) #生成整数序列
m=40 # 设置数组长度参数为40
y=np.linspace(price_apple[0],price_apple[-1],m)#生成起始值是苹果公司股票5月13日收盘价、终止值是5月17日收盘价且元素数量40的等差序列
print(y) # 输出变量y的值
#任务四
import numpy as np
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
price_amazon=np.array([1822.68,1840,12,1871.15,1907.57,1869.00]) # 创建NumPy数组price_amazon
zero_arrayl=np.zeros_like(price_amazon)#快速生成元素为零的一维数组
zero_array2=np.zeros_like(price_array)#快速生成元素为零的二维数组
one_arrayl=np.ones_like(price_amazon)#快速生成元素等于1的一维数组
one_array2=np.ones_like(price_array) #快速生成元素等于1的二维数组
print(zero_arrayl) # 输出变量zero_arrayl的值
print(zero_array2) # 输出变量zero_array2的值
print(one_arrayl) # 输出变量one_arrayl的值
print(one_array2) # 输出变量one_array2的值运行后核对:核对 price_amazon、price_app1e、price_apple、data1 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:只改变一个关键输入或业务场景,先预测输出如何变化,再运行验证并解释变化原因。
arange: [0 1 2 3 4 5 6 7 8 9]
linspace: [0. 0.25 0.5 0.75 1. ]
| 函数 | 参数含义 | 是否包含终止值 |
|---|---|---|
np.arange(start, stop, step) |
指定步长 | 不包含 |
np.linspace(start, stop, num) |
指定元素个数 | 包含 |
float32 比 float64 节省一半内存float64:精度更高,避免累积误差2D数组(3x3):
[[1 2 3]
[4 5 6]
[7 8 9]]
3x4数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
3×4=12 的数组只能重塑为元素总数为12的形状shape 返回元组,表示各维度的大小全0数组(2x3):
[[0. 0. 0.]
[0. 0. 0.]]
全1数组(3x4):
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
单位矩阵(3x3):
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
| 数组 | 函数 | 数学性质 |
|---|---|---|
| 零矩阵 | np.zeros() |
\(O + A = A\) |
| 全1矩阵 | np.ones() |
常用于广播运算 |
| 单位矩阵 | np.eye() |
\(I \cdot A = A \cdot I = A\) |
| 对角矩阵 | np.diag() |
协方差矩阵的简化形式 |
形状 shape: (2, 3)
维度 ndim: 2
元素总数 size: 6
数据类型 dtype: int64
重塑后(3x2):
[[1 2]
[3 4]
[5 6]]
| ndim | 结构 | Python创建方式 |
|---|---|---|
| 0 | 标量 | np.array(5) |
| 1 | 向量 | np.array([1,2,3]) |
| 2 | 矩阵 | np.array([[1,2],[3,4]]) |
| 3 | 张量 | np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) |
axis 参数ravel():性能更好,但注意共享内存flatten():更安全,修改互不影响加法: [5 7 9]
减法: [-3 -3 -3]
乘法: [ 4 10 18]
除法: [0.25 0.4 0.5 ]
幂运算: [1 4 9]
不同形状的数组也可以运算——NumPy自动扩展较小的数组:
* → 元素级(element-wise)@ 或 np.dot() → 矩阵乘法(线性代数)axis=0:沿行方向压缩(对每列操作)axis=1:沿列方向压缩(对每行操作)import numpy as np
# 5个交易日的收盘价
prices = np.array([100, 105, 103, 108, 106])
# 简单收益率:R_t = (P_t - P_{t-1}) / P_{t-1}
simple_returns = (prices[1:] - prices[:-1]) / prices[:-1]
# 对数收益率:r_t = ln(P_t / P_{t-1})
log_returns = np.log(prices[1:] / prices[:-1])
print('简单收益率:')
print(simple_returns)
print('\n对数收益率:')
print(log_returns)简单收益率:
[ 0.05 -0.01904762 0.04854369 -0.01851852]
对数收益率:
[ 0.04879016 -0.01923136 0.04740224 -0.01869213]
| 类型 | 公式 | 特点 |
|---|---|---|
| 简单收益率 | \(R_t = \frac{P_t - P_{t-1}}{P_{t-1}}\) | 直观,但不可跨期相加 |
| 对数收益率 | \(r_t = \ln\frac{P_t}{P_{t-1}}\) | 时间可加性:\(r_{total} = r_1 + r_2\) |
累计收益率:
[0.05 0.03 0.08 0.06]
总收益率: 0.0600
cumprod() 计算累积乘积float64,大数据集可用 float32reshape(-1) 自动推断,用 ravel() 避免复制np.log1p(x) 代替 np.log(1+x) 提高小数值精度lst-array-attributes、lst-array-stats 与 lst-returns-calculation,完成shape/dtype、axis统计和收益。(2资产,3日期),float64;缺失掩码同形布尔数组。import numpy as np # 导入数组工具以完成矩阵运算与数值检查
prices=np.array([[10.,10.2,10.1],[20.,19.8,20.4]],dtype=np.float64) # 建立价格或数组教学示例
zeros=np.zeros_like(prices); ones=np.ones_like(prices) # 建立价格或数组教学示例
missing_mask=np.zeros_like(prices,dtype=bool); missing_mask[1,1]=True # 建立价格或数组教学示例
adjusted=np.where(missing_mask,np.nan,prices) # 建立价格或数组教学示例
assert zeros.shape==ones.shape==prices.shape==missing_mask.shape # 建立价格或数组教学示例
assert zeros.dtype==prices.dtype and missing_mask.dtype==bool # 建立价格或数组教学示例
print(prices.shape,prices.dtype,zeros,ones,adjusted) # 建立价格或数组教学示例ndim/shape/size 且 size==shape 乘积。empty_like 自动清零。[商业大数据分析与应用]